﻿#pragma once
#include<iostream>
using namespace std;
//class Date
//{
//public:
//    // 重载 == 运算符，将函数声明为 const 成员函数
//    bool operator==(const Date& x1) const
//    {
//        return _year == x1._year
//            && _month == x1._month
//            && _day == x1._day;
//    }
//
//    // 构造函数，使用初始化列表初始化成员变量
//    Date(int year, int month, int day) : _year(year), _month(month), _day(day) {}
//
//private:
//    int _year;
//    int _month;
//    int _day;
//};

class Date
{
    friend ostream& operator<<(ostream& out, const Date& d);
    friend istream& operator>>(istream& in, Date& d);
public:
    //构造函数
    Date(int year = 1, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    //拷贝构造函数
    Date(const Date& d)
    {
        cout << " Date(const Date& d)" << endl;
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }

    // 传引⽤返回减少拷⻉ 
    // d1 = d2;
    Date& operator=(const Date& d)
    {
        // 不要检查⾃⼰给⾃⼰赋值的情况 
        if (this != &d)
        {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }
        // d1 = d2表达式的返回对象应该为d1，也就是*this 
        return *this;
    }
    /*   此写法无法实现连续赋值操作
    void operator=(const Date& d)
       {
           _year = d._year;
           _month = d._month;
           _day = d._day;
       }*/

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }

private:
    int _year;
    int _month;
    int _day;
};


ostream& operator<<(ostream& out, const Date& d)
{
    return out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
}

istream& operator>>(istream& in, Date& d)
{
    return in >> d._year >> d._month >> d._day;
}
